1.6 书店程序
现在我们已经准备好完成书店程序了。我们需要从一个文件中读取销售记录,生成每本书的销售报告,显示售出册数、总销售额和平均售价。我们假定每个ISBN书号的所有销售在文件中是聚在一起保存的。
我们的程序会将每个ISBN的所有数据合并起来,存入名为total的变量中。我们使用另一个名为trans的变量保存读取的每条销售记录。如果trans和total指向相同的ISBN,我们会更新total的值。否则,我们会打印total的值,并将其重置为刚刚读取的数据(trans):
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item total; // 保存下一条交易记录的变量
// 读取第一条交易记录,并确保有数据可以处理
if (std::cin >> total){
Sales_item trans; // 保存和的变量
// 读取并处理剩余交易记录
while (std::cin >> trans){
// 如果我们仍在处理相同的书
if (total.isbn() == trans.isbn())
total += trans; // 更新总销售额
else {
// 打印前一本书的结果
std::cout << total << std::endl;
total = trans; // total现在表示下一本书的销售额
}
}
std::cout << total << std::endl; // 打印最后一本书的结果
} else {
// 没有输入!警告读者
std::cerr << "NO data?!" << std::endl;
return -1; // 表示失败
}
return 0;
}
这是我们目前为止看到的最复杂的程序了,但它所使用的都是我们已经见过的语言特性。
与往常一样,首先包含要使用的头文件:来自标准库的iostream和自己定义的Sales_item.h。在main中,我们定义了一个名为total的变量,用来保存一个给定的ISBN的数据之和。我们首先读取第一条销售记录,存入total中,并检测读取操作是否成功。如果读取失败,则意味着没有任何销售记录,于是直接跳到最外层的else分支,打印一条警告信息,告诉用户没有输入。
假定已经成功读取了一条销售记录,我们继续执行最外层if之后的语句块。这个语句块首先定义一个名为trans的对象,它保存读取的销售记录。接下来的while语句将读取剩下的所有销售记录。与我们之前的程序一样,while条件是一个从标准输入读取值的操作。在本例中,我们读取一个Sales_item对象,存入trans中。只要读取成功,就执行while循环体。
while的循环体是一个单个的if语句,它检查ISBN是否相等。如果相等,使用复合赋值运算符将trans加到total中。如果ISBN不等,我们打印保存在total中的值,并将其重置为trans的值。在执行完if语句后,返回到while的循环条件,读取下一条销售记录,如此反复,直至所有销售记录都处理完。
当while语句终止时,total保存着文件中最后一个ISBN的数据。我们在语句块的最后一条语句中打印这最后一个ISBN的total值,直至最外层if语句就结束了。
普通的冒险故事提示您:看后求收藏(卧龙小说网http://www.wolongxs.com),接着再看更方便。
好书推荐:《我的剧本世界在自主运行》、《我是舰娘》、《我的师妹是妖女》、《交错世界之学院都市》、《认清现实后,她们开始追夫火葬场》、《好徒儿你就饶了为师伐》、